/**
 *	@file	cursor_mv.h
 *	@brief	選択カーソル表示/コントロールマネージャ
 *	@author	Miyuki Iwasawa
 *	@date	07.08.21
 */

#ifndef __H_CURSOR_MV_H__
#define __H_CURSOR_MV_H__

#include "system/clact_tool.h"

#ifdef GLOBAL
#undef GLOBAL
#endif

#ifdef __CURSOR_MV_H_GLOBAL
#define GLOBAL /***/
#else
#define GLOBAL extern
#endif


///カーソル制御位置パラメータ
typedef struct _CURSOR_MV_DAT{
 u16 id;	//idコード
 u8	left,right,up,down;	//リンクコード
 u8	px,py;	//カーソル表示ポジション
 s8	ofs_l,ofs_r,ofs_u,ofs_d;	//カーソルOBJ表示オフセット
}CURSORMV_DAT,CURSORMV_DAT_UNIT;

///カーソル制御OAM
typedef union _CURSOR_MV_OAM{
 CLACT_WORK_PTR	clact_p;
 CATS_ACT_PTR	cats_p;
 void*			oam_p;
}CURSORMV_OAM;

//struct _CURSOR_MV_PARAM;
typedef struct _CURSOR_MV_PARAM CURSORMV_PARAM;

///カーソル制御パラメータ登録
struct _CURSOR_MV_PARAM{
 u8	valid:1;	///<有効フラグ
 u8	oam_mode:1;	///<CLACT_WORK_PTRを使っているか、CATS_ACT_PTRを使っているか
 u8	type:1;		///<4隅カーソルか、単体のカーソルか？
 u8	padding:5;	///<
 u8	pos;	///<現選択ポジション
 u8	num;	///<要素数
 u8	max;
 CURSORMV_DAT* dat;	///<データ配列へのポインタ
 CURSORMV_PARAM* prev;	///<データ配列リンク
 CURSORMV_PARAM* next;	///<データ配列リンク


 ///利用オブジェ登録
 union{
	 struct{
		CURSORMV_OAM cur_lt;
		CURSORMV_OAM cur_lb;
		CURSORMV_OAM cur_rt;
		CURSORMV_OAM cur_rb;
	 };
	 CURSORMV_OAM cur_oam[4];
 };
};

///カーソル制御マネージャ
typedef struct _CURSOR_MV_MANAGER{
 u16	all_num;	///<管理エリア数
 u16	pc_idx;		///<カレントパラメータのindex
 CURSORMV_PARAM* ary;	///<パラメータ配列
 CURSORMV_PARAM* pc;	///<カレントパラメータポインタ
}CURSORMV_MANAGER;

///キー動作コード
enum{
 CURMV_CODE_NEXT,
 CURMV_CODE_END,
 CURMV_CODE_LOOP,
 CURMV_CODE_JUMP,
};

///OAMワーク種別コード
typedef enum{
 CURMV_OAM_CLACT,
 CURMV_OAM_CATS,
}CURMV_OAM_CODE;

///カーソルタイプ種別
typedef enum{
 CURMV_TYPE_ONE,	//1つのOAMで成り立つタイプ
 CURMV_TYPE_UNIT,	//4つ一組のユニットタイプ
}CURMV_CURSOR_TYPE;

///カーソルの移動方向定義
typedef enum{
 CURMV_DIR_LEFT,
 CURMV_DIR_RIGHT,
 CURMV_DIR_UP,
 CURMV_DIR_DOWN,
}CURMV_DIR_CODE;

#define CURMV_CURRENT	(0xFFFF)


/**
 *	@brief	カーソル移動制御マネージャワーク作成
 *
 *	@param	num	確保するパラメータワーク数
 *	@param	heapID	利用するheapID
 */
GLOBAL CURSORMV_MANAGER* CursorMvMan_Create(u16 num,int heapID);

/*
 *	@brief	カーソル移動制御マネージャ　削除
 */
GLOBAL void CursorMvMan_Release(CURSORMV_MANAGER* wk);

/**
 *	@brief	カーソル移動パラメータ登録(ユニットタイプ)
 *
 *	@param	wk	マネージャポインタ
 *	@param	dat	カーソル移動座標パラメータ配列へのポインタ
 *	@param	ini_pos	初期カーソルポジションidx
 *	@param	oam_mode	OAMのワークタイプ CURMV_OAM_CLACT or CURMV_OAM_CATS
 *	@param	cur_lt	左上カーソルOAMワーク(void*にキャストして引き渡す)
 *	@param	cur_lb	左下カーソルOAMワーク
 *	@param	cur_rt	右上カーソルOAMワーク
 *	@param	cur_rb	右下カーソルOAMワーク
 */
GLOBAL u16 CursorMvMan_EntryParamUnit(CURSORMV_MANAGER* wk,const CURSORMV_DAT* dat,u8 setnum,u8 ini_pos,
	CURMV_OAM_CODE oam_mode,int heapID,
	void* cur_lt,void* cur_lb,void* cur_rt,void* cur_rb );

/**
 *	@brief	登録されているワークパラメータを削除する
 *
 *	@param	idx	削除したいワークidx
 *
 *	@return	削除できたらTRUE
 */
GLOBAL BOOL CursorMvMan_DeleteParam(CURSORMV_MANAGER* wk,u16 idx);

/**
 *	@brief	空いているワークナンバーを返す
 *
 *	@retval	0xFFFF 空いているワークがない
 *	@retval	それ以外 ワークIdx
 */
GLOBAL u16	CursorMvMan_GetEnptyWorkNo(CURSORMV_MANAGER* wk);

/**
 *	@brief	指定したワークのカーソルを表示/非表示切替
 *
 *	@param	idx	指定ワークidx(CURMV_OAM_CURRENTを指定した場合、カレントを操作する)
 *	@param	flag	TRUE:描画、FALSE:非描画
 *
 *	@return	操作したワークidx
 */
GLOBAL u16 CursorMvMan_SetCursorDrawFlag(CURSORMV_MANAGER* wk,u16 idx,BOOL flag);

/*
 *	@brief	カレントのカーソルポジションをセットする
 *
 *	@param	pos カーソル位置
 */
GLOBAL u8 CursorMvMan_SetPos(CURSORMV_MANAGER* wk,u8 pos);

/**
 *	@brief	現在のカレントカーソルのポジションを取得する
 */
GLOBAL u8 CursorMvMan_GetPos(CURSORMV_MANAGER* wk);

/**
 *	@brief	指定indexパラメータのカーソルポジションを取得する
 *
 *	@param	idx	CURMV_CURRENTを指定した場合、カレントのポジションを取得する
 */
GLOBAL u8 CursorMvMan_GetPosIdx(CURSORMV_MANAGER* wk,u16 idx);

/*
 *	@brief	カレントカーソルを指定して、稼動する
 *
 *	@param	wk	マネージャーワーク
 *	@param	idx	カレント指定したいワークのidx
 *	@param	ini_pos 起動時の初期カーソル位置
 *
 *	@retval	0xFFFF エラー
 *	@retval それ以外 カレント指定されたワークidx
 */
GLOBAL u16 CursorMvMan_SetCurrent(CURSORMV_MANAGER* wk,u16 idx,u8 ini_pos);

/**
 *	@brief	カレントカーソルポジションを進める
 *
 *	@param	dif	進める値(マイナスなら前方向に進む)
 */
GLOBAL u8 CursorMvMan_MovePos(CURSORMV_MANAGER* wk,u8 dif);

/**
 *	@brief	カーソルポジションをセットする
 *
 *	@param	wk	マネージャーワーク
 *	@param	idx	カレント指定したいワークのidx(CURMV_CURRENTを指定した場合、カレントを操作する)
 *	@param	ini_pos 起動時の初期カーソル位置
 *
 *	@return	設定されたカーソルポジションNo
 */
GLOBAL u8 CursorMvMan_SetPosIdx(CURSORMV_MANAGER* wk,u16 idx,u8 pos);

/**
 *	@brief	カーソルのアニメ状態を制御するセットする
 *
 *	@param	wk	マネージャーワーク
 *	@param	idx	カレント指定したいワークのidx(CURMV_CURRENTを指定した場合、カレントを操作する)
 *	@param  flag TRUE:アニメOn,FALSE:アニメOff
 *
 *	@return	設定されたカーソルポジションNo
 */
GLOBAL void CursorMvMan_SetAnmFlagIdx(CURSORMV_MANAGER* wk,u16 idx,BOOL flag);

#endif	//__H_CUROSR_MV_H__